# 成都链家二手房
"""
1.分行政区爬取所需信息。
2.确定信息所在位置（ul > li）
3.确定使用的方法：requests > selenium
4.确定使用的解析器：正则表达式 > xpath > bs4
5.确定网站反扒机制，根据对应机制采取对应措施(反反爬虫)
6.爬取单页信息
7.根据网站规则爬取多页信息
8.数据持久化（将数据保存：表格、数据库......）
"""
import requests
from bs4 import BeautifulSoup
import json
import csv
from tqdm import tqdm

"""
面向函数编程：
1.创建一个函数执行requests请求的功能
2.创建主函数执行提取信息的功能
"""


# 创建请求函数
def get_requests(url):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36 Edg/95.0.1020.30'
    }
    resp = requests.get(url=url, headers=headers)
    if resp.status_code == 200:
        soup = BeautifulSoup(resp.text, 'lxml')
        return soup
    else:
        print(resp.status_code)


# 获取行政区名和链接的函数
def country(html_code):
    # 获取行政区所在a标签
    a_list = html_code.select(
        'body > div:nth-child(12) > div > div.position > dl:nth-child(2) > dd > div:nth-child(1) > div > a')
    # print(a_list)

    dict_1 = {}
    for i in a_list:
        # 行政区名
        name = i.text
        # 链接
        href = 'https://cd.lianjia.com' + i.attrs['href']
        # print(name, href)
        dict_1[name] = href
    return dict_1


# 获取每个行政区二手房总页数
def get_page_num(html_code):
    page_dict = html_code.select_one(
        '#content > div.leftContent > div.contentBottom.clear > div.page-box.fr > div').attrs['page-data']
    # print(page_dict)
    # 将字符串类型的字典转回字典，并且将总页数提取出来
    num = json.loads(page_dict)['totalPage']
    return num


# 创建主函数
def main(url):
    # 请求链家二手房链接
    code_1 = get_requests(url)
    # print(code_1)
    # 调用获取country()函数
    country_dict = country(code_1)
    # print(country_dict)
    for key, value in country_dict.items():
        # print(key, value)
        # 请求行政区链接
        code_2 = get_requests(value)
        # print(code_2)
        # 调用get_page_num函数
        total_page = get_page_num(code_2)
        # print(total_page)

        # 数据持久化
        f = open(f'./成都{key}二手房信息', 'w', encoding='utf-8', newline='')
        # 创建CSV写方法
        mywrite = csv.writer(f)
        # 列名
        col_name = ['行政区', '标题', '小区', '街道', '户型', '面积', '装修', '单价', '总价']
        mywrite.writerow(col_name)

        for i in tqdm(range(1, total_page + 1), desc=key):
            # 拼接有页数的链接
            new_href = value + f'pg{i}/'
            # print(new_href)
            html_code = get_requests(new_href)

            li_list = html_code.select('#content > div.leftContent > ul > li > div.info.clear')
            # print(li_list, len(li_list))

            for i in li_list:
                # print(i)
                # 房屋标题
                title = i.select_one('div.info.clear > div.title > a').text

                # 地址
                address_1 = i.select_one('div.info.clear > div.flood > div > a:nth-child(2)').text
                address_2 = i.select_one('div.info.clear > div.flood > div > a:nth-child(3)').text

                # 基本信息
                info = i.select_one('div.info.clear > div.address > div').text

                info_list = info.split('|')

                # 户型
                type = info_list[0].strip()

                # 面积
                area = info_list[1].strip()

                # 装修
                decorate = info_list[3].strip()

                # 单价
                unit_price = i.select_one('div.info.clear > div.priceInfo > div.unitPrice > span').text

                # 总价
                total_price = i.select_one('div.info.clear > div.priceInfo > div.totalPrice.totalPrice2 > span').text

                # print(key, title, address_1, address_2, type, area, decorate, unit_price, total_price)
                data = [key, title, address_1, address_2, type, area, decorate, unit_price, total_price]

                mywrite.writerow(data)

        f.close()


# 程序从此处开始执行
URL = 'https://cd.lianjia.com/ershoufang/rs/'
main(URL)
